﻿using Onshi.POS.Formularios.Properties;
using Onshi.POS.Formularios.Recursos;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Entidades.Tipos;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Articulos;
using Onshi.POS.Articulos.Vistas;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;

namespace Onshi.POS.Formularios
{
    public partial class DescuentosRecargosCantidades : FormularioBase, IDescuentosRecargosCantidades
    {
        #region Constructores

        public DescuentosRecargosCantidades(Boolean esBusqueda)
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            btnSeleccionar.Visible = esBusqueda;
            presentador = new DescuentosRecargosCantidadesPresentador(this);
            procesando = new Procesando();
        }

        #endregion

        #region Atributos

        private Boolean inicializando = true;
        private DescuentosRecargosCantidadesPresentador presentador;
        private Int32 idDescuentoRecargoCantidad;
        private enum MetodoHilo { Inicializar, Actualizar, Aceptar, Eliminar };
        private Int32 detalleId;
        private Decimal detalleDescuentoRecargo;
        private Int32 detalleCantidad;

        #endregion

        #region Propiedades

        [Browsable(false)]
        public List<DescuentoRecargoCantidadDetalle> ListadoDetalles
        {
            get { return (List<DescuentoRecargoCantidadDetalle>)bsDetalles.DataSource; }
            set { bsDetalles.DataSource = value; }
        }

        [Browsable(false)]
        public Int32 DetalleId
        {
            get { return detalleId; }
        }

        [Browsable(false)]
        public Int32 DetalleCantidad
        {
            get { return detalleCantidad; }
        }

        [Browsable(false)]
        public Decimal DetalleDescuentoRecargo
        {
            get { return detalleDescuentoRecargo; }
        }

        [Browsable(false)]
        public Int32 IdDescuentoRecargoCantidadSeleccionado
        {
            get { return idDescuentoRecargoCantidad; }
        }

        [Browsable(false)]
        public Int32 IdUsuarioSistema
        {
            get { return Principal.IdUsuarioSistema; }
        }

        [Browsable(false)]
        public Int32 IdDescuentoRecargoCantidad
        {
            get { return idDescuentoRecargoCantidad; }
        }

        [Browsable(false)]
        public String Nombre
        {
            get { return txtNombre.Text; }
        }

        [Browsable(false)]
        public String NombreFiltro
        {
            get { return txtNombreFiltro.Text; }
        }

        [Browsable(false)]
        public String Observaciones
        {
            get { return txtObservaciones.Text; }
        }

        [Browsable(false)]
        public List<DescuentoRecargoCantidad> ListadoDescuentosRecargosCantidades
        {
            set { bsDescuentosRecargosCantidades.DataSource = new SortableList<DescuentoRecargoCantidad>(value); }
        }

        [Browsable(false)]
        public EnumSiNo ObservacionesFiltro
        {
            get { return (EnumSiNo)((Byte)cboObservacionesFiltro.SelectedValue); }
        }

        #endregion

        #region Metodos

        private void ActualizarCampos()
        {
            if (bsDescuentosRecargosCantidades.Current != null)
            {
                idDescuentoRecargoCantidad = ((DescuentoRecargoCantidad)bsDescuentosRecargosCantidades.Current).Id;
                txtNombre.Text = ((DescuentoRecargoCantidad)bsDescuentosRecargosCantidades.Current).Nombre;
                txtObservaciones.Text = ((DescuentoRecargoCantidad)bsDescuentosRecargosCantidades.Current).Observaciones;
                bsDetalles.DataSource = ((DescuentoRecargoCantidad)bsDescuentosRecargosCantidades.Current).Detalles;
            }
            else
                LimpiarCampos();
        }

        private void LimpiarFiltro()
        {
            inicializando = true;
            txtNombreFiltro.Text = String.Empty;
            cboObservacionesFiltro.SelectedValue = (Byte)EnumSiNo.Todos;
            inicializando = false;
        }

        private void LimpiarCampos()
        {
            errDescuentosRecargosCantidades.Clear();
            idDescuentoRecargoCantidad = 0;
            txtNombre.Text = String.Empty;
            txtObservaciones.Text = String.Empty;
            bsDetalles.DataSource = new List<DescuentoRecargoCantidadDetalle>();
        }

        private void HabilitarControles(Boolean habilitar)
        {
            txtNombre.Enabled = habilitar;
            txtObservaciones.Enabled = habilitar;
            btnNuevo.Enabled = !habilitar;
            btnModificar.Enabled = !habilitar;
            btnEliminar.Enabled = !habilitar;
            btnAceptar.Enabled = habilitar;
            btnCancelar.Enabled = habilitar;
            navDescuentosRecargosCantidades.Enabled = !habilitar;
            if (!habilitar)
                ValidarControles();
            HabilitarControlesDetalle();
        }

        private void HabilitarControlesDetalle()
        {
            if (navDescuentosRecargosCantidades.Enabled)
            {
                btnDetalleAgregar.Enabled = false;
                btnDetalleEditar.Enabled = false;
                btnDetalleQuitar.Enabled = false;
            }
            else
            {
                btnDetalleAgregar.Enabled = true;
                if (bsDetalles.Current != null)
                {
                    btnDetalleEditar.Enabled = true;
                    btnDetalleQuitar.Enabled = true;
                }
                else
                {
                    btnDetalleEditar.Enabled = false;
                    btnDetalleQuitar.Enabled = false;
                }
            }
        }

        private void ValidarControles()
        {
            if (bsDescuentosRecargosCantidades.Current != null)
            {
                btnSeleccionar.Enabled = true;
                if (((DescuentoRecargoCantidad)bsDescuentosRecargosCantidades.Current).Id == (Int32)EnumDescuentosRecargosCantidades.SinDescuentoNiRecargo)
                {
                    btnModificar.Enabled = false;
                    btnEliminar.Enabled = false;
                }
                else
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = true;
                }
            }
            else
            {
                idDescuentoRecargoCantidad = 0;
                btnSeleccionar.Enabled = false;
                btnModificar.Enabled = false;
                btnEliminar.Enabled = false;
            }
        }

        private void Filtrar()
        {
            if (!inicializando)
                presentador.Filtrar();
        }

        #endregion

        #region Eventos

        #region Filtro

        private void txtNombreFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboObservacionesFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        #endregion

        private void DescuentosRecargosCantidades_Load(Object sender, EventArgs e)
        {
            solDescuentosRecargosCantidades.SelectedTab = tabDetalle;
            solDescuentosRecargosCantidades.SelectedTab = tabListado;
            grdDescuentosRecargosCantidades.ScrollBars = ScrollBars.None;
            bgwDescuentosRecargosCantidades.RunWorkerAsync(MetodoHilo.Inicializar);
            procesando.ShowDialog();
        }

        private void btnNuevo_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles(true);
            txtNombre.Focus();
        }

        private void btnModificar_Click(Object sender, EventArgs e)
        {
            HabilitarControles(true);
            txtNombre.Focus();
        }

        private void btnEliminar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("Los artículos que posean este descuento y recargo por cantidad se actualizarán con el predeterminado" + Environment.NewLine + "¿Está seguro que desea eliminar el descuento y recargo por cantidad?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                bgwDescuentosRecargosCantidades.RunWorkerAsync(MetodoHilo.Eliminar);
                procesando.ShowDialog();
            }
        }

        private void btnAceptar_Click(Object sender, EventArgs e)
        {
            var validado = true;
            errDescuentosRecargosCantidades.Clear();
            if (String.IsNullOrWhiteSpace(txtNombre.Text))
            {
                validado = false;
                errDescuentosRecargosCantidades.SetError(txtNombre, "El nombre no puede quedar vacío");
            }
            if (validado)
            {
                bgwDescuentosRecargosCantidades.RunWorkerAsync(MetodoHilo.Aceptar);
                procesando.ShowDialog();
            }
        }

        private void btnCancelar_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles(false);
            ActualizarCampos();
        }

        private void btnActualizar_Click(Object sender, EventArgs e)
        {
            bgwDescuentosRecargosCantidades.RunWorkerAsync(MetodoHilo.Actualizar);
            procesando.ShowDialog();
        }

        private void btnSeleccionar_Click(Object sender, EventArgs e)
        {
            idDescuentoRecargoCantidad = ((DescuentoRecargoCantidad)bsDescuentosRecargosCantidades.Current).Id;
            DialogResult = DialogResult.OK;
        }

        private void btnSalir_Click(Object sender, EventArgs e)
        {
            Close();
        }

        private void btnLimpiar_Click(Object sender, EventArgs e)
        {
            LimpiarFiltro();
            presentador.Filtrar();
        }

        private void solDescuentosRecargosCantidades_Selecting(Object sender, TabControlCancelEventArgs e)
        {
            if (solDescuentosRecargosCantidades.SelectedTab == tabDetalle)
                ActualizarCampos();
            else
                if (!navDescuentosRecargosCantidades.Enabled)
                    e.Cancel = true;
        }

        private void grdDescuentosRecargosCantidades_CellFormatting(Object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (bsDescuentosRecargosCantidades.Count > 0 && bsDescuentosRecargosCantidades.Count == grdDescuentosRecargosCantidades.RowCount)
            {
                if (grdDescuentosRecargosCantidades.Columns[e.ColumnIndex].Index == colObservaciones.Index)
                    if (((DescuentoRecargoCantidad)bsDescuentosRecargosCantidades.List[e.RowIndex]).Observaciones != String.Empty)
                        e.Value = Properties.Resources.page_copy;
            }
        }

        private void grdDescuentosRecargosCantidades_CellClick(Object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
                if (bsDescuentosRecargosCantidades.Current != null && e.ColumnIndex == colDetalle.Index)
                {
                    var descuentosRecargosDetalle = new DescuentosRecargosCantidadesDetalle(((DescuentoRecargoCantidad)bsDescuentosRecargosCantidades.Current).Id);
                    descuentosRecargosDetalle.ShowDialog();
                }
        }

        private void bgwDescuentosRecargosCantidades_DoWork(Object sender, DoWorkEventArgs e)
        {
            try
            {
                switch ((MetodoHilo)e.Argument)
                {
                    case MetodoHilo.Inicializar:
                        presentador.Inicializar();
                        cboObservacionesFiltro.Actualizar();
                        break;
                    case MetodoHilo.Actualizar:
                        presentador.Actualizar();
                        break;
                    case MetodoHilo.Aceptar:
                        presentador.Aceptar();
                        LimpiarCampos();
                        HabilitarControles(false);
                        ActualizarCampos();
                        solDescuentosRecargosCantidades.SelectedTab = tabListado;
                        break;
                    case MetodoHilo.Eliminar:
                        presentador.Eliminar();
                        solDescuentosRecargosCantidades.SelectedTab = tabListado;
                        break;
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(ex.Message);
            }
        }

        private void bgwDescuentosRecargosCantidades_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
        {
            inicializando = false;
            procesando.Close();
            if (e.Error != null)
                MessageBox.Show(e.Error.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                actDescuentosRecargosCantidades.Actualizar();
            grdDescuentosRecargosCantidades.ScrollBars = ScrollBars.Both;
        }

        private void bsDescuentosRecargosCantidades_PositionChanged(Object sender, EventArgs e)
        {
            if (solDescuentosRecargosCantidades.SelectedTab == tabDetalle)
                ActualizarCampos();
        }

        private void grdDescuentosRecargosCantidades_SelectionChanged(Object sender, EventArgs e)
        {
            ValidarControles();
        }

        private void btnDetalleAgregar_Click(Object sender, EventArgs e)
        {
            var descuentosRecargosCantidadesDetalles = new DescuentosRecargosCantidadesDetalles();
            if (descuentosRecargosCantidadesDetalles.ShowDialog() == DialogResult.OK)
            {
                detalleId = descuentosRecargosCantidadesDetalles.idDetalle;
                detalleCantidad = Convert.ToInt32(descuentosRecargosCantidadesDetalles.numCantidad.Value);
                detalleDescuentoRecargo = descuentosRecargosCantidadesDetalles.numDescuentoRecargo.Value;
                try
                {
                    presentador.DetalleAgregar();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void btnDetalleEditar_Click(Object sender, EventArgs e)
        {
            var descuentosRecargosCantidadesDetalles = new DescuentosRecargosCantidadesDetalles();
            descuentosRecargosCantidadesDetalles.idDetalle = ((DescuentoRecargoCantidadDetalle)bsDetalles.Current).Id;
            descuentosRecargosCantidadesDetalles.numCantidad.Value = ((DescuentoRecargoCantidadDetalle)bsDetalles.Current).Cantidad;
            descuentosRecargosCantidadesDetalles.numDescuentoRecargo.Value = ((DescuentoRecargoCantidadDetalle)bsDetalles.Current).DescuentoRecargo;
            if (descuentosRecargosCantidadesDetalles.ShowDialog() == DialogResult.OK)
            {
                detalleId = descuentosRecargosCantidadesDetalles.idDetalle;
                detalleCantidad = Convert.ToInt32(descuentosRecargosCantidadesDetalles.numCantidad.Value);
                detalleDescuentoRecargo = descuentosRecargosCantidadesDetalles.numDescuentoRecargo.Value;
                try
                {
                    presentador.DetalleEditar();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void btnDetalleQuitar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Está seguro que desea eliminar la combinación?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                detalleId = ((DescuentoRecargoCantidadDetalle)bsDetalles.Current).Id;
                try
                {
                    presentador.DetalleQuitar();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void grdDetalles_SelectionChanged(Object sender, EventArgs e)
        {
            HabilitarControlesDetalle();
        }

        #endregion
    }
}